import { ref, computed } from 'vue'

/**
 * 购物车商品接口
 */
export interface CartItem {
  id: string | number
  title: string
  price: number
  num: number
  image: string
  desc?: string
}

/**
 * 购物车状态管理 Composable
 * 提供购物车的增删改查功能
 */
export const useCart = () => {
  // 购物车商品列表
  const cartItems = ref<CartItem[]>([])

  /**
   * 计算购物车总数量
   */
  const totalQuantity = computed(() => {
    return cartItems.value.reduce((total, item) => total + item.num, 0)
  })

  /**
   * 计算购物车总价格
   */
  const totalPrice = computed(() => {
    return cartItems.value.reduce((total, item) => total + (item.price * item.num), 0)
  })

  /**
   * 添加商品到购物车
   * @param product 商品信息
   * @param num 数量，默认为1
   */
  const addToCart = (product: Omit<CartItem, 'num'>, num: number = 1) => {
    const existingItem = cartItems.value.find(item => item.id === product.id)
    
    if (existingItem) {
      // 如果商品已存在，增加数量
      existingItem.num += num
    } else {
      // 如果商品不存在，添加新商品
      cartItems.value.push({
        ...product,
        num
      })
    }
    
    uni.showToast({
      title: '已加入购物车',
      icon: 'success'
    })
  }

  /**
   * 更新购物车商品数量
   * @param id 商品ID
   * @param num 新数量
   */
  const updateQuantity = (id: string | number, num: number) => {
    const item = cartItems.value.find(item => item.id === id)
    if (item) {
      if (num <= 0) {
        // 数量为0时移除商品
        removeFromCart(id)
      } else {
        item.num = num
      }
    }
  }

  /**
   * 从购物车移除商品
   * @param id 商品ID
   */
  const removeFromCart = (id: string | number) => {
    const index = cartItems.value.findIndex(item => item.id === id)
    if (index > -1) {
      cartItems.value.splice(index, 1)
    }
  }

  /**
   * 清空购物车
   */
  const clearCart = () => {
    cartItems.value = []
  }

  /**
   * 获取购物车商品ID列表（逗号分隔的字符串）
   * @returns 商品ID字符串，如 "1,2,3"
   */
  const getCartItemIds = (): string => {
    return cartItems.value.map(item => item.id).join(',')
  }

  /**
   * 检查商品是否在购物车中
   * @param id 商品ID
   * @returns 是否在购物车中
   */
  const isInCart = (id: string | number): boolean => {
    return cartItems.value.some(item => item.id === id)
  }

  /**
   * 获取商品在购物车中的数量
   * @param id 商品ID
   * @returns 商品数量
   */
  const getItemQuantity = (id: string | number): number => {
    const item = cartItems.value.find(item => item.id === id)
    return item ? item.num : 0
  }

  return {
    cartItems,
    totalQuantity,
    totalPrice,
    addToCart,
    updateQuantity,
    removeFromCart,
    clearCart,
    getCartItemIds,
    isInCart,
    getItemQuantity
  }
}

// 全局购物车实例
export const globalCart = useCart()